home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol06 / 03 / wintro6 / print.c < prev    next >
C/C++ Source or Header  |  1991-05-01  |  10KB  |  355 lines

  1. /* POPPADP.C -- Popup Editor Printing Functions */
  2.  
  3. #include <windows.h>
  4. #include <drivinit.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include "stock.h"
  8.  
  9. int PASCAL GraphWndPrint(HWND hWnd, HDC hDC, LPSTOCKINFO lpStockInfo);
  10.  
  11. BOOL bUserAbort = FALSE;
  12. HWND hDlgPrint = NULL;
  13.  
  14. char szDevice[160];    /* Contains the device, the driver, and the port */
  15. PSTR szDriver;        /* Pointer to the driver name             */
  16. PSTR szPort;        /* Port, ie, LPT1                 */
  17. PSTR szTitle;        /* Global pointer to job title             */
  18. int iPrinter = 0;    /* level of available printer support.         */
  19.             /* 0 - no printer available             */
  20.             /* 1 - printer available             */
  21.             /* 2 - driver supports 3.0 device initialization */
  22. HANDLE hInitData=NULL;    /* handle to initialization data         */
  23.  
  24. char szExtDeviceMode[] = "EXTDEVICEMODE";
  25.  
  26.  
  27. /****************************************************************************
  28.  *                                        *
  29.  *  FUNCTION   : GetPrinterDC ()                        *
  30.  *                                        *
  31.  *  PURPOSE    : Creates a printer display context for the default device.  *
  32.  *         As a side effect, it sets the szDevice and szPort variables*
  33.  *         It also sets iPrinter to the supported level of printing.  *
  34.  *                                        *
  35.  *  RETURNS    : HDC   - A handle to printer DC.                *
  36.  *                                        *
  37.  ****************************************************************************/
  38. HDC FAR PASCAL GetPrinterDC(void)
  39. {
  40.     char     szT[32];
  41.     HDC      hdc;
  42.     LPSTR    lpdevmode = NULL;
  43.  
  44.     iPrinter = 0;
  45.  
  46.     /* Get the printer information from win.ini into a buffer and
  47.      * null terminate it.
  48.      */
  49.     GetProfileString ( "windows", "device", "" ,szDevice, sizeof(szDevice));
  50.     for (szDriver = szDevice; *szDriver && *szDriver != ','; szDriver++)
  51.     ;
  52.     if (*szDriver)
  53.     *szDriver++ = 0;
  54.  
  55.     /* From the current position in the buffer, null teminate the
  56.      * list of ports
  57.      */
  58.     for (szPort = szDriver; *szPort && *szPort != ','; szPort++)
  59.     ;
  60.     if (*szPort)
  61.     *szPort++ = 0;
  62.  
  63.     /* if the device, driver and port buffers all contain meaningful data,
  64.      * proceed.
  65.      */
  66.     if (!*szDevice || !*szDriver || !*szPort){
  67.     *szDevice = 0;
  68.     return NULL;
  69.     }
  70.  
  71.     /* Create the printer display context */
  72.     if (hInitData){
  73.     /* Get a pointer to the initialization data */
  74.     lpdevmode = (LPSTR) LocalLock (hInitData);
  75.  
  76.     if (lstrcmp (szDevice, lpdevmode)){
  77.         /* User has changed the device... cancel this setup, as it is
  78.          * invalid (although if we worked harder we could retain some
  79.          * of it).
  80.          */
  81.         lpdevmode = NULL;
  82.         LocalUnlock (hInitData);
  83.         LocalFree (hInitData);
  84.         hInitData = NULL;
  85.     }
  86.     }
  87.     hdc = CreateDC (szDriver, szDevice, szPort, lpdevmode);
  88.  
  89.     /* Unlock initialization data */
  90.     if (hInitData)
  91.     LocalUnlock (hInitData);
  92.  
  93.     if (!hdc)
  94.     return NULL;
  95.  
  96.  
  97.     iPrinter = 1;
  98.  
  99.     /* Find out if ExtDeviceMode() is supported and set flag appropriately */
  100.     if (GetProcAddress (GetModuleHandle (szDriver), szExtDeviceMode))
  101.     iPrinter = 2;
  102.  
  103.     return hdc;
  104.  
  105. }
  106.  
  107. /****************************************************************************
  108.  *                                        *
  109.  *  FUNCTION   : AbortProc()                            *
  110.  *                                        *
  111.  *  PURPOSE    : To be called by GDI print code to check for user abort.    *
  112.  *                                        *
  113.  ****************************************************************************/
  114. BOOL FAR PASCAL AbortProc(hPrinterDC, nCode)
  115.   HDC hPrinterDC;
  116.   short nCode;
  117. {
  118.   MSG msg;
  119.  
  120.   while (!bUserAbort && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  121.     if (!hDlgPrint || !IsDialogMessage(hDlgPrint, &msg))
  122.     {
  123.       TranslateMessage(&msg);
  124.       DispatchMessage(&msg);
  125.     }
  126.   return !bUserAbort;
  127. }
  128.  
  129.  
  130. /****************************************************************************
  131.  *                                        *
  132.  *  FUNCTION   : PrintDlgProc ()                        *
  133.  *                                        *
  134.  *  PURPOSE    : Dialog function for the print cancel dialog box.        *
  135.  *                                        *
  136.  *  RETURNS    : TRUE  - OK to abort/ not OK to abort                *
  137.  *         FALSE - otherwise.                        *
  138.  *                                        *
  139.  ****************************************************************************/
  140. BOOL FAR PASCAL PrintDlgProc(hDlg, iMessage, wParam, lParam)
  141.   HWND hDlg;
  142.   unsigned iMessage;
  143.   WORD wParam;
  144.   LONG lParam;
  145. {
  146.   switch (iMessage)
  147.   {
  148.   case WM_INITDIALOG:
  149.     /* Set up information in dialog box */
  150.     SetDlgItemText (hDlg, IDD_PRINTDEVICE, (LPSTR) szDevice);
  151.     SetDlgItemText (hDlg, IDD_PRINTPORT, (LPSTR) szPort);
  152.     SetDlgItemText (hDlg, IDD_PRINTTITLE, (LPSTR) szTitle);
  153.     EnableMenuItem(GetSystemMenu(hDlg, FALSE), SC_CLOSE,
  154.            MF_GRAYED);
  155.     break;
  156.  
  157.   case WM_COMMAND:
  158.     bUserAbort = TRUE;
  159.     EnableWindow(GetParent(hDlg), TRUE);
  160.     DestroyWindow(hDlg);
  161.     hDlgPrint = 0;
  162.     break;
  163.  
  164.   default:
  165.     return FALSE;
  166.   }
  167.   return TRUE;
  168. }
  169.  
  170.  
  171. /****************************************************************************
  172.  *                                        *
  173.  *  FUNCTION   : PrintFile ()                            *
  174.  *                                        *
  175.  *  PURPOSE    : Prints the contents of the edit control.            *
  176.  *                                        *
  177.  ****************************************************************************/
  178.  
  179. BOOL PASCAL PrintFile(void)
  180. {
  181.   BOOL  bError = FALSE;
  182.   char  szMsg[40];
  183.   FARPROC lpfnAbortProc, lpfnPrintDlgProc;
  184.   HDC   hPrnDC;
  185.   RECT  rect;
  186.   short yChar, nCharsPerLine, nLinesPerPage, 
  187.         nTotalLines, nTotalPages, nPage, nLine, nLineNum = 0;
  188.   TEXTMETRIC tm;
  189.  
  190.   if (!hWndActive)
  191.     return FALSE;
  192.  
  193.   if (NULL == (hPrnDC = GetPrinterDC()))
  194.     return TRUE;
  195.  
  196.   GetTextMetrics(hPrnDC, &tm);
  197.   yChar = tm.tmHeight + tm.tmExternalLeading;
  198.  
  199.   nCharsPerLine = GetDeviceCaps(hPrnDC, HORZRES) / tm.tmAveCharWidth;
  200.   nLinesPerPage = GetDeviceCaps(hPrnDC, VERTRES) / yChar;
  201.  
  202.   EnableWindow(hWndMain, FALSE);
  203.  
  204.   bUserAbort = FALSE;
  205.   lpfnPrintDlgProc = MakeProcInstance(PrintDlgProc, hThisInstance);
  206.   hDlgPrint = CreateDialog(hThisInstance, "PrintDlgBox", hWndMain, lpfnPrintDlgProc);
  207.   if (hDlgPrint)
  208.   {
  209.     ShowWindow(hDlgPrint, SW_SHOW);
  210.     UpdateWindow(hDlgPrint);
  211.   }
  212.  
  213.   lpfnAbortProc = MakeProcInstance(AbortProc, hThisInstance);
  214.   Escape(hPrnDC, SETABORTPROC, 0, (LPSTR) lpfnAbortProc, NULL);
  215.  
  216.   /*
  217.     Start printing
  218.   */
  219.   strcpy(szMsg, "Stock");
  220.   if (Escape(hPrnDC, STARTDOC, strlen(szMsg), szMsg, NULL) > 0)
  221.   {
  222.       HANDLE      hStockInfo;
  223.       LPSTOCKINFO lpStockInfo;
  224.  
  225.       if ((hStockInfo = GetWindowWord(hWndActive, 0)) != NULL && 
  226.           (lpStockInfo = (LPSTOCKINFO) GlobalLock(hStockInfo)))
  227.       {
  228.         GraphWndPaint(hWndActive, hPrnDC, lpStockInfo, TRUE);
  229.         GlobalUnlock(hStockInfo);
  230.       }
  231.   }
  232.   else
  233.     bError = TRUE;
  234.  
  235.   /*
  236.     End the printing operation
  237.   */
  238. end:
  239.   if (!bError)
  240.   {
  241.     Escape(hPrnDC, NEWFRAME, 0, NULL, NULL);
  242.     Escape(hPrnDC, ENDDOC, 0, NULL, NULL);
  243.   }
  244.  
  245.   if (!bUserAbort)
  246.   {
  247.     EnableWindow(hWndMain, TRUE);
  248.     if (hDlgPrint)
  249.       DestroyWindow(hDlgPrint);
  250.     hDlgPrint = NULL;
  251.   }
  252.  
  253.   if (bError)
  254.     MessageBox(hWndMain, "Could not print", "Stock", MB_OK | MB_ICONEXCLAMATION);
  255.  
  256.   FreeProcInstance(lpfnPrintDlgProc);
  257.   FreeProcInstance(lpfnAbortProc);
  258.   DeleteDC(hPrnDC);
  259.  
  260.   return bError || bUserAbort;
  261. }
  262.  
  263.  
  264. /****************************************************************************
  265.  *                                        *
  266.  *  FUNCTION   : GetInitializationData()                    *
  267.  *                                        *
  268.  *  PURPOSE    : Gets DC initialization data from a printer driver        *
  269.  *         supporting ExtDeviceMode(). Called in response to the        *
  270.  *         File/Printer setup menu selection.                *
  271.  *                                        *
  272.  *         This function allows the user to change the printer        *
  273.  *         settings FOR MULTIPAD ONLY.  This allows Multipad to print *
  274.  *         in a variety of settings without messing up any other        *
  275.  *         applications. In a more sophisticated application, this    *
  276.  *         setup could even be saved on a document-by-document basis. *
  277.  *                                        *
  278.  ****************************************************************************/
  279. BOOL FAR PASCAL GetInitializationData( hwnd )
  280. HWND hwnd ;
  281. {
  282.     LPSTR     lpOld;
  283.     LPSTR     lpNew;
  284.     FARPROC   lpfn;
  285.     HANDLE    hT,hDrv;
  286.     char      sz[32];
  287.     WORD      cb;
  288.     int       flag;
  289.  
  290.     /* Pop up dialog for user and retain data in app buffer */
  291.     flag = DM_PROMPT | DM_COPY;
  292.  
  293.     /* Load the device driver and find the ExtDeviceMode() function */
  294.     wsprintf (sz, "%s.drv", (LPSTR)szDriver);
  295.     if ((hDrv = LoadLibrary (sz)) < 32)
  296.     return FALSE;
  297.     if (!(lpfn = GetProcAddress (hDrv, szExtDeviceMode)))
  298.     return FALSE;
  299.  
  300.     if (hInitData){
  301.     /* We have some old data... we want to modify the previously specified
  302.      * setup rather than starting with the default setup.
  303.      */
  304.     lpOld = (LPSTR)LocalLock(hInitData);
  305.     flag |= DM_MODIFY;
  306.     }
  307.     else
  308.     lpOld = NULL;
  309.  
  310.     /* Get the number of bytes needed for the init data */
  311.     cb = (*lpfn) (hwnd,
  312.           hDrv,
  313.           NULL,
  314.           (LPSTR)szDevice,
  315.           (LPSTR)szPort,
  316.           (LPDEVMODE)NULL,
  317.           (LPSTR)NULL,
  318.           0);
  319.  
  320.     /* Grab some memory for the new data and lock it. */
  321.     hT      = LocalAlloc (LHND,cb);
  322.     lpNew = (LPSTR)LocalLock (hT);
  323.  
  324.     /* Post the device mode dialog. 0 flag iff user hits OK button */
  325.     if ((*lpfn) (hwnd,
  326.          hDrv,
  327.          (LPDEVMODE)lpNew,
  328.          (LPSTR)szDevice,
  329.          (LPSTR)szPort,
  330.          (LPDEVMODE)lpOld,
  331.          (LPSTR)NULL,
  332.          flag)==IDOK)
  333.     flag = 0;
  334.  
  335.     /* Unlock the input structures */
  336.     LocalUnlock (hT);
  337.     if (hInitData)
  338.     LocalUnlock (hInitData);
  339.  
  340.     /* If the user hit OK and everything worked, free the original init.
  341.      * data and retain the new one.  Otherwise, toss the new buffer.
  342.      */
  343.     if (flag)
  344.     LocalFree (hT);
  345.     else{
  346.     if (hInitData)
  347.         LocalFree (hInitData);
  348.     hInitData = hT;
  349.     }
  350.  
  351.     FreeLibrary(hDrv);
  352.     return (!flag);
  353. }
  354.  
  355.